複数のLambda Layersに同じ名前のフォルダがある場合の動作を確認してみた
同じ名前のフォルダがあっても、問題なくファイルが参照できます。ただし、ファイル名も同じ場合は、片方のみが参照されます。
2024.03.14
ひとつのLambdaで複数のLambda Layersを使っているとき、ふと気になったんです。 「それぞれのLambda Layersに同じ名前のフォルダがあったらどうなるんだろう?」と。
├── layers1 │ └── hello │ └── hello_layers1.py └── layers2 └── hello └── hello_layers2.py
というわけで、試してみました。
おすすめの方
- 複数のLambda Layersに同じ名前のフォルダがある場合の動作を知りたい方
異なるLambda Layersで同じフォルダ名の場合を試してみる
sam init
sam init \ --runtime python3.11 \ --name lambda-layers-same-folder-name-sample \ --app-template hello-world \ --no-tracing \ --no-application-insights \ --structured-logging \ --package-type Zip
Lambda Layers
Lambda Layers用のフォルダを作ります。
mkdir -p layers1/hello mkdir -p layers2/hello
このフォルダに対して、異なる名前のファイルを作成します。
Layersコード(その1)
touch layers1/hello/hello_layers1.py
def hello(): return "hello from layers1"
Layersコード(その2)
touch layers2/hello/hello_layers2.py
def hello(): return "hello from layers2"
Lambdaコード
import json from hello import hello_layers1 from hello import hello_layers2 def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps( { "hello1": hello_layers1.hello(), "hello2": hello_layers2.hello(), } ), }
AWS SAMテンプレート
2つのLambda Layersと1つのLambdaをデプロイします。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: lambda-layers-same-folder-name-sample Resources: Hello1Layer: Type: AWS::Serverless::LayerVersion Metadata: BuildMethod: python3.11 Properties: LayerName: hello1-layer ContentUri: layers1 CompatibleRuntimes: - python3.11 Hello2Layer: Type: AWS::Serverless::LayerVersion Metadata: BuildMethod: python3.11 Properties: LayerName: hello2-layer ContentUri: layers2 CompatibleRuntimes: - python3.11 HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello_world/ Handler: app.lambda_handler Timeout: 3 Runtime: python3.11 Architectures: - x86_64 Layers: - !Ref Hello1Layer - !Ref Hello2Layer Events: HelloWorld: Type: Api Properties: Path: /hello Method: get HelloWorldFunctionLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
デプロイ
sam build --use-container sam deploy \ --guided \ --region ap-northeast-1 \ --stack-name lambda-layers-same-folder-name-sample-stack
APIを呼ぶと、それぞれのファイルが参照できていた
$ curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello {"hello1": "hello from layers1", "hello2": "hello from layers2"}
おまけ: 異なるLambda Layersで同じフォルダ名&同じファイル名の場合を試してみる
同じファイル名の場合は、片方のファイルのみが参照されました。
$ curl https://xxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello {"hello1": "hello from layers2", "hello2": "hello from layers2"}
同じファイル名にする
mv layers1/hello/hello_layers1.py layers1/hello/hello_layers.py mv layers2/hello/hello_layers2.py layers2/hello/hello_layers.py
Lambdaコード
import json from hello import hello_layers from hello import hello_layers def lambda_handler(event, context): return { "statusCode": 200, "body": json.dumps( { "hello1": hello_layers.hello(), "hello2": hello_layers.hello(), } ), }